import tkinter as tk
from flask import Flask, request, jsonify
import threading
import os
import signal

app = Flask(__name__)

# 创建主窗口
root = tk.Tk()
root.title("API 接收端")

# 创建端口输入框和标签
port_label = tk.Label(root, text="监听端口:")
port_label.pack()
port_entry = tk.Entry(root, width=10)
port_entry.insert(0, "5000")
port_entry.pack()

# 创建启动/停止按钮
start_stop_button = tk.Button(root, text="启动服务器")
start_stop_button.pack()

# 创建显示接收到的数据的文本框
history_text = tk.Text(root, height=10, width=50)
history_text.pack()

# 存储历史记录的列表
history_records = []
# 存储服务器线程
server_thread = None


@app.route('/api/test', methods=['POST'])
def test_api():
    try:
        data = request.get_json()
        if data:
            global history_records
            # 将新记录添加到历史记录列表
            history_records.append(f"接收到的数据: {data}")
            # 若历史记录超过 10 条，移除最早的记录
            if len(history_records) > 10:
                history_records.pop(0)
            # 清空文本框内容
            history_text.delete(1.0, tk.END)
            # 将历史记录逐行显示在文本框中
            for record in history_records:
                history_text.insert(tk.END, record + '\n')
            response = {'message': '数据已成功接收', 'received_data': data}
            return jsonify(response), 200
        else:
            return jsonify({'error': '未接收到有效的 JSON 数据'}), 400
    except Exception as e:
        return jsonify({'error': str(e)}), 500


def run_flask_app():
    try:
        port = int(port_entry.get())
        app.run(debug=False, host='127.0.0.1', port=port)
    except ValueError:
        history_text.insert(tk.END, "端口号必须是有效的整数\n")


def start_or_stop_server():
    global server_thread
    if start_stop_button.cget("text") == "启动服务器":
        # 启动服务器
        server_thread = threading.Thread(target=run_flask_app)
        server_thread.start()
        start_stop_button.config(text="停止服务器")
    else:
        # 停止服务器
        if server_thread:
            # 在 Windows 上，无法直接发送信号，这里简单粗暴地退出程序
            if os.name == 'nt':
                os._exit(0)
            else:
                # 在 Linux 和 macOS 上，发送 SIGTERM 信号停止服务器
                os.kill(os.getpid(), signal.SIGTERM)


start_stop_button.config(command=start_or_stop_server)


def clear_history_text():
    global history_records
    history_records = []
    history_text.delete(1.0, tk.END)


# 创建右键菜单
right_click_menu = tk.Menu(root, tearoff=0)
right_click_menu.add_command(label="清除历史数据", command=clear_history_text)


def show_right_click_menu(event):
    right_click_menu.post(event.x_root, event.y_root)


# 为历史记录文本框绑定右键点击事件
history_text.bind("<Button-3>", show_right_click_menu)

# 运行主循环
root.mainloop()